package com.heima.wemedia.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.injector.methods.SelectOne;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.model.common.dtos.PageResponseResult;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import com.heima.model.wemedia.dtos.SensitiveDto;
import com.heima.model.wemedia.pojos.WmChannel;
import com.heima.model.wemedia.pojos.WmSensitive;
import com.heima.wemedia.mapper.WmSensitiveMapper;
import com.heima.wemedia.service.WmSensitiveService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;

@Service
@Transactional
@Slf4j
public class WmSensitiveServiceImpl extends ServiceImpl<WmSensitiveMapper, WmSensitive> implements WmSensitiveService {

	/**
	 * 新增敏感词
	 *
	 * @param wmSensitive
	 * @return
	 */
	@Override
	public ResponseResult insert(WmSensitive wmSensitive) {
		//判断参数是否有值
		if (wmSensitive.getSensitives() == null) {
			return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "参数为空，请重试");
		}
		//根据敏感词从数据库中查找敏感词对象
		WmSensitive sensitives = getOne(new QueryWrapper<WmSensitive>().eq("sensitives", wmSensitive.getSensitives()));
		//如果从数据库查找的敏感词对象存在，则提示敏感词已存在，不能保存
		if (sensitives != null) {
			return ResponseResult.errorResult(AppHttpCodeEnum.DATA_EXIST, "敏感词已存在，请勿重复添加");
		}
		//给前端传递的敏感词对象设置创建时间
		wmSensitive.setCreatedTime(new Date());
		//将敏感词对象保存到数据库中
		save(wmSensitive);
		//返回插入成功的提示，传递给前端
		return ResponseResult.okResult(wmSensitive);
	}

	/**
	 * 查询敏感词列表
	 *
	 * @param dto
	 * @return
	 */
	@Override
	//主要功能是从数据库中查询敏感词列表，并支持分页和模糊查询
	public ResponseResult list(SensitiveDto dto) {
		// 1. 检查参数,如果参数为空，则返回错误提示
		if (dto == null) {
			return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
		}

		// 2. 检查分页，调用PageRequestDto的checkParam方法检查参数
		//dto是SensitiveDto的实例化对象，SensitiveDto又继承了PageRequestDto类
		//所以dto可以调用PageRequestDto类中的checkParam方法检查参数
		dto.checkParam();

		// 3. 模糊查询 + 分页
		//创建一个分页对象page，该对象需要两个参数：当前页码dto.getPage()和每页显示的记录数dto.getSize()
		//这表示查询的是第dto.getPage()页的数据，每页包含dto.getSize()条记录
		IPage page = new Page(dto.getPage(), dto.getSize());
		//创建一个LambdaQueryWrapper对象，用于封装查询条件
		//LambdaQueryWrapper是MyBatis-Plus提供的一个查询条件构造器，通过Lambda表达式来避免硬编码的字符串
		LambdaQueryWrapper<WmSensitive> lambdaQueryWrapper = new LambdaQueryWrapper<>();
		//检查dto对象中的name属性是否为空且不只包含空白字符
		//如果不为空，则使用like方法构建一个模糊查询条件，查询WmSensitive实体中sensitives字段与dto.getName()模糊匹配的记录
		if (StringUtils.isNotBlank(dto.getName())) {
			lambdaQueryWrapper.like(WmSensitive::getSensitives, dto.getName());
		}
		//根据传入的page对象和lambdaQueryWrapper对象执行分页查询
		//查询结果会被填充到page对象中，包括总记录数、当前页的记录列表等信息
		page = page(page, lambdaQueryWrapper);

		// 4. 结果返回
		//创建一个PageResponseResult对象来封装查询结果，包括当前页码、每页显示的记录数、总记录数等信息
		ResponseResult responseResult = new PageResponseResult(dto.getPage(), dto.getSize(), (int) page.getTotal());
		//然后将查询到的记录列表调用setData方法设置到responseResult对象中
		responseResult.setData(page.getRecords());
		//最后，将responseResult对象返回给调用方，即前端
		return responseResult;
	}

	/**
	 * 修改敏感词
	 *
	 * @param wmSensitive
	 * @return
	 */
	@Override
	public ResponseResult update(WmSensitive wmSensitive) {
		//检查参数，判断参数是否合法
		if (wmSensitive == null || wmSensitive.getSensitives() == null || wmSensitive.getSensitives().trim().isEmpty()) {
			return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "参数不能为空，请重试");
		}
		//根据id查询敏感词信息,修改敏感词，然后重新插入到数据库中
		WmSensitive wmSensitiveDB = getById(wmSensitive.getId());
		//判断数据库中的wmSensitiveDB是否存在
		if (wmSensitiveDB == null) {
			return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
		}

		//如果数据存在，将数据库中的数据设置为前端传递过来的数据
		wmSensitiveDB.setSensitives(wmSensitive.getSensitives());
		//将数据库中的数据更新
		saveOrUpdate(wmSensitiveDB);
		//返回成功信息给前端
		return ResponseResult.okResult(wmSensitiveDB);
	}

	/**
	 * 删除敏感词
	 *
	 * @param id
	 * @return
	 */
	@Override
	public ResponseResult delete(Integer id) {
		//参数判断，判断参数是否合法
		if (id == null || id < 0) {
			return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID, "参数无效");
		}
		//根据id查找敏感词对象
		WmSensitive wmSensitive = getById(id);
		//判断敏感词对象是否为空，为空直接提示被删除对象不存在
		if (wmSensitive == null) {
			return ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST);
		}
		//直接根据id删除敏感词对象
		removeById(id);
		//设置返回值
		return ResponseResult.errorResult(AppHttpCodeEnum.SUCCESS);
	}
}
